<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>面向对象</title>
</head>
<body>
<script>
    //谈一谈你理解的面向对象
    /*
    * 面向对象和面向过程都是一种编程思想
    * 对象: Object
    * Object是js中的基类,js中所有的内置类都是在Object的基础上构造出来的
    * 所以,js本身就是一门面向对象的编程语言
    * 我们在去研究这些js中的实例(string, number, array, promise...)的时候, 一般都是研究他们共同的属性和方法, 通过对于这些属性和方法的总结
    * 把拥有同一属性和方法的一些实例归为一类, 然后再去研究和观察这个类
    *
    * js中的面向对象会稍微有些特殊,因为js中的面向对象都是根据原型和原型链的规则来构建出来的
    * 我们常用的一些框架也是通过面向对象的编程思想构建出来的(Vue Angular React JQuery)
    * 我们自己封装过的一些组件/插件/方法(API.js,轮播图,分页器,$.ajax)也是基于面向对象开发的,通过创造不同的实例, 来管理一些方法和属性
    *
    *
    *
    * 类: Class(构造函数)
    *   封装 高内聚低耦合
    *
    *   多态
    *        重写 修改已有的属性和方法
    *        重载 js本身是没有重载的,重载对于客户端代码来说没有必要,我们可以通过arguments或者条件判断来实现重载效果
    *
    *
    *   继承 子类继承父类的属性和方法
    *       目的 可以让子类的 实例 能够使用父类的属性和方法
    *       JS中的继承有很多种
    *       1.原型链继承
    *       2.call继承(借用构造函数继承)
    *       3.组合继承
    *       4.寄生组合继承
    *       5.ES6中新增Class继承
    *
    * */

    //重载
    //严格意义来说js中不存在重载 但是可以通过一些封装进行实现类似效果
    //重载 方法名相同 形参个数或者形参数据类型不同 导致方法内部处理逻辑不同

    /*
        并法数
        int: 数据类型==> 长整型 4567890456789 ==>number
    * pubic function fn (a:int, b:int):string{
    *   return (a + b).toString()
    * }
    * pubic function fn (a:string, b:string):string{
    *   return (a + b).toString()
    * }
    * fn(1,2);
    * fn("1","2");
    *
    * */



  /*  function sum(a,b){
        return a+b
    }
    function sum(a){
        if(typeof a == "string"){

        }


        return ""+ a + b
    }
    sum(1,2);
    sum("1","2");*/


  /*  sum("1",1); //==>2 "11"
    sum(1,1,1); //==>3 2
    sum([1,1,1]); //==>3 NaN
    sum({a:1,b:2}); //==>3 NaN*/


</script>
</body>
</html>